package modelo.seniales;

import modelo.carrera.Infraccion;
import modelo.comportamiento.Accion;
import modelo.comportamiento.AccionRecomendada;
import modelo.comportamiento.AccionSemaforo;
import modelo.comportamiento.Prioridad;
import modelo.escenario.Ciudad;
import modelo.escenario.Cuadra;
import modelo.geometria.Circunferencia;
import modelo.geometria.Vector;
import modelo.geometria.Rectangulo;
import modelo.obstaculos.Obstaculo;
import modelo.repositorios.RepositorioAcciones;
import modelo.vehiculos.Vehiculo;

import compartido.IEntidad;
import compartido.ITransaccion;

public class Semaforo extends Obstaculo implements ISenial, IEntidad, ITransaccion {
	
	protected long id;
	protected ColorSemaforo color;
	protected Cuadra cuadra;
	protected EsquinaSemaforo esquina;
	protected int tiempoCambioColor;
	private int contadorCambioColor;
	
	public Semaforo(long identificador, Vector posicion, double radioCuerpo, EsquinaSemaforo esquina, ColorSemaforo color, int tiempoCambioColor) {
		super(new Circunferencia(posicion, radioCuerpo));
		this.id = identificador;
		this.color = color;
		this.tiempoCambioColor = tiempoCambioColor;
		this.contadorCambioColor = tiempoCambioColor;
		this.cuadra = Ciudad.getCiudad().getCuadra(getPosicion());
		this.esquina = esquina;
	}
	
	private Rectangulo obtenerUbicacionEnCuadra(){
	
		if (esquina == EsquinaSemaforo.INICIO) 
			return cuadra.getZonaFin();
		else 
			return cuadra.getZonaComienzo();
	}
	
	
	public boolean isRojo() {
		return color == ColorSemaforo.ROJO;
	}
	 
	public boolean isVerde() {
		return color == ColorSemaforo.VERDE;
	}
	 
	public boolean isAmarillo() {
		return color == ColorSemaforo.AMARILLO;
	}

	public void setRojo() {
		color = ColorSemaforo.ROJO;
	}

	@Override
	public String generarHashcode(Vehiculo vehiculo) {
		String hashcode = "<Semaforo>";
		hashcode += null;//TODO new String(vehiculo.getVelocidad()); //TODO: TRANSFORMAR LA VELOCIDAD
		hashcode += Vehiculo.interpretarDistancia(vehiculo.getDistanciaVertical(this));
		hashcode += Vehiculo.interpretarVelocidad(vehiculo.getVelocidad());
		
		return hashcode;
	}

	@Override
	public boolean cumple(Vehiculo vehiculo) {
		if (vehiculo.getCuerpo().solapa(obtenerUbicacionEnCuadra()))
				return isRojo() && (vehiculo.getVelocidad()==0);
		return true;
	}

	@Override
	public Infraccion obtenerInfraccion() {
		return Infraccion.infraccionSemaforoRojo();
	}
	
	@Override
	public String getIdentificador() {
		return String.valueOf(id);
	}

	@Override
	public int activar() {
		
		if (contadorCambioColor == 0)
		{
			if (isRojo())
				color = ColorSemaforo.VERDE;
			else if (isAmarillo())
				color = ColorSemaforo.ROJO;
			else
				color = ColorSemaforo.AMARILLO;
			
			contadorCambioColor = tiempoCambioColor; 
		}
		contadorCambioColor--;
			
		return 0;
	}

	@Override
	public int getPrioridad() {
		return 0;
	}

	public Object getColor() {
		return color;
	}
	
	public EsquinaSemaforo getEsquina() {
		return esquina;
	}
	
	public int getTiempoCambioColor() {
		return tiempoCambioColor;
	}
	
	static public String interpretarColor(ColorSemaforo color) {
		if (color == ColorSemaforo.VERDE) return "<Color_Verde>";
		if (color == ColorSemaforo.AMARILLO) return "<Color_Amarillo>";
		return "<Color_Rojo>";
	}
	
	public AccionRecomendada analizarSituacion(Vehiculo vehiculo) {
		AccionRecomendada accion = new AccionRecomendada(Prioridad.ALTA, new AccionSemaforo(0,vehiculo.getDistancia(this)));
		return accion;
	}

}
